// 数据劫持
import Dep from "./dep";

export default class Observer {
    constructor(data) {
        // console.log('数据劫持',data);
        // 转存数据
        this.data = data;
        // 遍历对象,完成所有数据的劫持
        this.walk(this.data);
    }

    /**
     * 遍历对象
     * @param data
     */
    walk(data) {
        // 没有数据或者数据的类型不是object
        if (!data || typeof data != 'object') {
            return;
        }
        // 获取对象中的所有Key
        Object.keys(data).forEach(key => {
            // console.log(key);
            this.defineReactive(data, key, data[key]);
        });
    }


    /**
     * 动态设置响应式数据
     * @param data 要劫持的数据
     * @param key 数据key
     * @param value 数据value
     */
    defineReactive(data, key, value) {
        let dep = new Dep();
        Object.defineProperty(data, key, {
            // 可遍历
            enumerable: true,
            // 不可再配置
            configurable: false,
            get: () => {
                Dep.target && dep.addSub(Dep.target);
                // console.log("get");
                return value;
            },
            set: newValue => {
                // console.log("set");
                value = newValue;
                // TODO 触发Vue页面的变化
                dep.notify();
            }
        });
        // 递归
        this.walk(value);
    }
}
